<?php



/**

 * Default elFinder connector

 *

 * @author Dmitry (dio) Levashov

 **/

class elFinderConnector {

	/**

	 * elFinder instance

	 *

	 * @var elFinder

	 **/

	protected $elFinder;

	

	/**

	 * Options

	 *

	 * @var aray

	 **/

	protected $options = array();

	

	/**

	 * undocumented class variable

	 *

	 * @var string

	 **/

	protected $header = 'Content-Type: application/json';

	

	

	/**

	 * Constructor

	 *

	 * @return void

	 * @author Dmitry (dio) Levashov

	 **/

	public function __construct($elFinder, $debug=false) {

		

		$this->elFinder = $elFinder;

		if ($debug) {

			$this->header = 'Content-Type: text/html; charset=utf-8';

		}

	}

	

	/**

	 * Execute elFinder command and output result

	 *

	 * @return void

	 * @author Dmitry (dio) Levashov

	 **/

	public function run() {

		$isPost = $_SERVER["REQUEST_METHOD"] == 'POST';

		$src    = $_SERVER["REQUEST_METHOD"] == 'POST' ? $_POST : $_GET;

		$cmd    = isset($src['cmd']) ? $src['cmd'] : '';

		$args   = array();

		

		if (!function_exists('json_encode')) {

			$error = $this->elFinder->error(elFinder::ERROR_CONF, elFinder::ERROR_CONF_NO_JSON);

			$this->output(array('error' => '{"error":["'.implode('","', $error).'"]}', 'raw' => true));

		}

		

		if (!$this->elFinder->loaded()) {

			$this->output(array('error' => $this->elFinder->error(elFinder::ERROR_CONF, elFinder::ERROR_CONF_NO_VOL), 'debug' => $this->elFinder->mountErrors));

		}

		

		// telepat_mode: on

		if (!$cmd && $isPost) {

			$this->output(array('error' => $this->elFinder->error(elFinder::ERROR_UPLOAD, elFinder::ERROR_UPLOAD_TOTAL_SIZE), 'header' => 'Content-Type: text/html'));

		}

		// telepat_mode: off

		

		if (!$this->elFinder->commandExists($cmd)) {

			$this->output(array('error' => $this->elFinder->error(elFinder::ERROR_UNKNOWN_CMD)));

		}

		

		// collect required arguments to exec command

		foreach ($this->elFinder->commandArgsList($cmd) as $name => $req) {

			$arg = $name == 'FILES' 

				? $_FILES 

				: (isset($src[$name]) ? $src[$name] : '');

				

			if (!is_array($arg)) {

				$arg = trim($arg);

			}

			if ($req && (!isset($arg) || $arg === '')) {

				$this->output(array('error' => $this->elFinder->error(elFinder::ERROR_INV_PARAMS, $cmd)));

			}

			$args[$name] = $arg;

		}

		

		$args['debug'] = isset($src['debug']) ? !!$src['debug'] : false;

		

		$this->output($this->elFinder->exec($cmd, $args));

	}

	

	/**

	 * Output json

	 *

	 * @param  array  data to output

	 * @return void

	 * @author Dmitry (dio) Levashov

	 **/

	protected function output(array $data) {

		$header = isset($data['header']) ? $data['header'] : $this->header;

		unset($data['header']);

		if ($header) {

			if (is_array($header)) {

				foreach ($header as $h) {

					header($h);

				}

			} else {

				header($header);

			}

		}

		

		if (isset($data['pointer'])) {

			rewind($data['pointer']);

			fpassthru($data['pointer']);

			if (!empty($data['volume'])) {

				$data['volume']->close($data['pointer'], $data['info']['hash']);

			}

			exit();

		} else {

			if (!empty($data['raw']) && !empty($data['error'])) {

				exit($data['error']);

			} else {

				exit(json_encode($data));

			}

		}

		

	}

	

}// END class 

